package JianZhiOffer;


/**
 *
 * 请实现一个函数，输入一个整数，
 * 输出该数二进制表示中 1 的个数。例如，把 9 表示成二进制是 1001，有 2 位是 1。
 * 因此，如果输入 9，则该函数输出 2。
 *
 */
public class Solution15 {

    /**
     * 开总的馊主意
     * */
    public int hammingWeight(int n) {
        String str = Integer.toBinaryString(n);
        char[] c = str.toCharArray();
        int res = 0;
        for(int i=0;i < c.length; i++){
            if(c[i] == '1'){
                res++;
            }
        }
        return res;
    }

    /**
     * 1、n 与 1 相与，如果结果为1，则最后一位是1，否则是0
     * 2、把n右移，继续执行1
     * 当n=0时跳出循环
     * */
    public static int hammingWeight1(int n) {
        int res = 0;
        while(n != 0) {
            if((n & 1) == 1) res++;
            n >>>= 1;
        }
        return res;
    }

    /**
     * 1、n =      101011000
     * 2、(n - 1)= 101010001
     * 3、res++; n = n & (n-1)
     * 当n=0时，跳出循环
     * */
    public static int hammingWeight2(int n) {
        int res = 0;
        while(n != 0) {
            res++;
            n = n & (n - 1);
        }
        return res;
    }


    public static void main(String[] args) {
        System.out.println(hammingWeight1(168));
    }
}
